home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2004 #2 / Amiga Plus CD - 2004 - No. 02.iso / AmiSoft / Dev / misc / WHDLoad_dev.lha / WHDLoad / Src / slave-examples / battleisle.asm next >
Encoding:
Assembly Source File  |  2003-12-09  |  11.6 KB  |  594 lines

  1. ;*---------------------------------------------------------------------------
  2. ;  :Program.    battelisle.asm
  3. ;  :Contents.    Slave for "Battle Isle" from Blue Byte
  4. ;  :Author.    Wepl
  5. ;  :Original    v1 wepl@whdload.de
  6. ;  :Version.    $Id: battleisle.asm 0.13 2003/12/09 11:15:06 wepl Exp wepl $
  7. ;  :History.    04.03.00 started
  8. ;        16.04.00 finished
  9. ;        11.05.00 support for us-version added
  10. ;        24.11.00 keyboard fixed
  11. ;        20.12.00 small change
  12. ;        03.08.01 cleanup for new kickemu
  13. ;        30.11.02 support for french version added, variable keyboard layout
  14. ;        18.06.03 kickemu cache option used
  15. ;  :Requires.    -
  16. ;  :Copyright.    Public Domain
  17. ;  :Language.    68000 Assembler
  18. ;  :Translator.    Devpac 3.14, Barfly 2.9
  19. ;  :To Do.
  20. ;---------------------------------------------------------------------------*
  21.  
  22.     INCDIR    Includes:
  23.     INCLUDE    whdload.i
  24.     INCLUDE    whdmacros.i
  25.  
  26.     IFD BARFLY
  27.     OUTPUT    "wart:b/battleisle/BattleIsle.Slave"
  28.     BOPT    O+                ;enable optimizing
  29.     BOPT    OG+                ;enable optimizing
  30.     BOPT    ODd-                ;disable mul optimizing
  31.     BOPT    ODe-                ;disable mul optimizing
  32.     BOPT    w4-                ;disable 64k warnings
  33.     SUPER
  34.     ENDC
  35.  
  36. UPPER    MACRO
  37.         cmp.b    #"a",\1
  38.         blo    .l\@
  39.         cmp.b    #"z",\1
  40.         bhi    .l\@
  41.         sub.b    #$20,\1
  42. .l\@
  43.     ENDM
  44.  
  45. ;============================================================================
  46.  
  47. CHIPMEMSIZE    = $66000
  48. FASTMEMSIZE    = $49000
  49. NUMDRIVES    = 1
  50. WPDRIVES    = %0000
  51.  
  52. CACHE
  53. ;BLACKSCREEN
  54. ;DEBUG
  55. ;DISKSONBOOT
  56. ;DOSASSIGN
  57. ;HDINIT
  58. ;HRTMON
  59. ;IOCACHE    = 1024
  60. ;MEMFREE    = $200
  61. ;NEEDFPU
  62. ;SETPATCH
  63.  
  64. ;============================================================================
  65.  
  66. KICKSIZE    = $40000            ;34.005
  67. BASEMEM        = CHIPMEMSIZE
  68. EXPMEM        = KICKSIZE+FASTMEMSIZE
  69.  
  70. ;============================================================================
  71.  
  72. _base        SLAVE_HEADER            ;ws_Security + ws_ID
  73.         dc.w    13            ;ws_Version
  74.         dc.w    WHDLF_NoError|WHDLF_Req68020|WHDLF_EmulPriv    ;ws_flags
  75.         dc.l    BASEMEM            ;ws_BaseMemSize
  76.         dc.l    0            ;ws_ExecInstall
  77.         dc.w    _boot-_base        ;ws_GameLoader
  78.         dc.w    _data-_base        ;ws_CurrentDir
  79.         dc.w    0            ;ws_DontCache
  80. _keydebug    dc.b    0            ;ws_keydebug
  81. _keyexit    dc.b    $59            ;ws_keyexit = F10
  82. _expmem        dc.l    EXPMEM            ;ws_ExpMem
  83.         dc.w    _name-_base        ;ws_name
  84.         dc.w    _copy-_base        ;ws_copy
  85.         dc.w    _info-_base        ;ws_info
  86.  
  87. ;============================================================================
  88.  
  89.     IFD BARFLY
  90.     DOSCMD    "WDate  >T:date"
  91.     ENDC
  92.  
  93. _name        dc.b    "Battle Isle",0
  94. _copy        dc.b    "1991-93 Blue Byte",0
  95. _info        dc.b    "adapted by Wepl",10
  96.         dc.b    "Version 1.6 "
  97.     IFD BARFLY
  98.         INCBIN    "T:date"
  99.     ENDC
  100.         dc.b    0
  101. _data        dc.b    "data",0
  102. _introe        dc.b    "intro.prg.en",0
  103. _introd        dc.b    "intro.prg.de",0
  104. _main        dc.b    "battle.prg",0
  105. _desert        dc.b    "d01/battle20.prg",0
  106. _moon        dc.b    "d02/mond.dwn",0
  107.  
  108. _extrad        dc.b    "LIB/PART.TAB",0    ;only desert
  109.         dc.b    "LIB/PATT.LIB",0
  110.  
  111. _extram        dc.b    "00.PAL",0        ;both
  112.         dc.b    "01.PAL",0
  113.         dc.b    "AMOK.DAT",0
  114.         dc.b    "BNIM/FAB00.ANI",0
  115.         dc.b    "BNIM/FAB01.ANI",0
  116.         dc.b    "GROUND.DAT",0
  117.         dc.b    "KOCW.DAT",0
  118.         dc.b    "LIB/PART.LIB",0
  119.         dc.b    "LIB/PFIGHT.LIB",0
  120.         dc.b    "MENU.PAL",0
  121.         dc.b    "MENU.PCK",0
  122.  
  123.         dc.b    "UNIT.DAT",0        ;only moon
  124.         dc.b    "LOOSER.SND",0
  125.         dc.b    "STATS.PCK",0
  126.         dc.b    "WINNER.SND",0
  127.         dc.b    "MOND.DWN",0
  128.         dc.b    "BNIM/END.PAL",0
  129.         dc.b    "BNIM/END.SND",0
  130.         dc.b    "BNIM/HQ.PAL",0
  131.         dc.b    "BNIM/TOT.ANI",0
  132.         dc.b    "BNIM/TOT.PAL",0
  133.         dc.b    "BNIM/END.ANI",0
  134.         dc.b    "BNIM/HQ.SND",0
  135.         dc.b    "BNIM/TOT.SND",0
  136.         dc.b    "BNIM/HQ.ANI",0
  137.         dc.b    "LIB/PBIGUNIT.LIB",0
  138.         dc.b    "LIB/UNIT.LIB",0
  139.         dc.b    "LIB/CURSOR.LIB",0
  140.         dc.b    "GAME.PAL",0
  141.         dc.b    "GAME.SND",0
  142.         dc.b    "MAP02.LIB",0
  143.         dc.b    "MAP04.LIB",0
  144.         dc.b    "MAPINFO.DAT",0
  145.         dc.b    "TITEL.TXT",0
  146.     EVEN
  147.  
  148. _tab        dc.w    $dba2,0,0    ;crc
  149.         dc.w    _plie-_tab    ;patch list
  150.         dc.w    _introe-_tab    ;file name
  151.         dc.l    0,0        ;patch keyboard
  152.  
  153.         dc.w    $eb46,0,0    ;crc
  154.         dc.w    _plid-_tab    ;patch list
  155.         dc.w    _introd-_tab    ;file name
  156.         dc.l    0,0        ;patch keyboard
  157.  
  158.         dc.w    $1c05,$9a61,$8223 ;crc german,english,french
  159.         dc.w    _pl-_tab    ;patch list
  160.         dc.w    _main-_tab    ;file name
  161.         dc.l    $18cd        ;patch keyboard 'Y'
  162.         dc.l    $21e6c        ;patch keyboard map
  163.  
  164.         dc.w    $7d5c,0,0    ;crc
  165.         dc.w    _pld-_tab    ;patch list
  166.         dc.w    _desert-_tab    ;file name
  167.         dc.l    $18cd        ;patch keyboard 'Y'
  168.         dc.l    $21e7c        ;patch keyboard map
  169.  
  170.         dc.w    $E442,0,0    ;crc
  171.         dc.w    _plm-_tab    ;patch list
  172.         dc.w    _moon-_tab    ;file name
  173.         dc.l    $198f        ;patch keyboard 'Y'
  174.         dc.l    $22f24        ;patch keyboard map
  175.  
  176. ;============================================================================
  177.  
  178. _bootearly    move.l    (_resload,pc),a2    ;a2 = resload
  179.  
  180.     ;get tags
  181.         lea    (_tag,pc),a0
  182.         jsr    (resload_Control,a2)
  183.         
  184.         move.l    (_custom1),d0
  185.         subq.l    #1,d0
  186.         bmi    .badver
  187.         cmp.l    #5,d0
  188.         bhs    .badver
  189.         
  190.         mulu    #18,d0
  191.         lea    (_tab,pc),a0
  192.         move.l    a0,a1
  193.         add.l    d0,a1
  194.         movem.w    (a1)+,d4-d6        ;d4-d6 = crc
  195.         move.w    (a1)+,a3
  196.         add.l    a0,a3            ;a3 = patchlist
  197.         move.w    (a1)+,a4
  198.         add.l    a0,a4            ;a4 = name
  199.         move.l    (a1)+,-(a7)
  200.         move.l    (a1)+,-(a7)
  201.  
  202.     ;get filesize
  203.         move.l    a4,a0
  204.         jsr    (resload_GetFileSizeDec,a2)
  205.         move.l    d0,d7            ;d7 = length
  206.         
  207.     ;load program
  208.         move.l    d7,d0
  209.         moveq    #0,d1
  210.         move.l    (4),a6
  211.         jsr    (_LVOAllocMem,a6)
  212.         move.l    d0,a5            ;a5 = address
  213.  
  214.         move.l    a4,a0
  215.         move.l    a5,a1
  216.         jsr    (resload_LoadFileDecrunch,a2)
  217.  
  218.     ;check version
  219.         move.l    d7,d0
  220.         move.l    a5,a0
  221.         jsr    (resload_CRC16,a2)
  222.         cmp.w    d4,D0
  223.         beq    .verok
  224.         cmp.w    d5,D0
  225.         beq    .verok
  226.         cmp.w    d6,D0
  227.         beq    .verok
  228. .badver        pea    TDREASON_WRONGVER
  229.         jmp    (resload_Abort,a2)
  230. .verok
  231.     ;disable doslib
  232.         move.l    (4),a0
  233.         add.w    #_LVOOpenLibrary+2,a0
  234.         lea    _openlib_save,a1
  235.         move.l    (a0),(a1)
  236.         lea    _openlib,a1
  237.         move.l    a1,(a0)
  238.  
  239.     ;patch program
  240.         move.l    a3,a0
  241.         move.l    a5,a1
  242.         jsr    (resload_Patch,a2)
  243.  
  244.     ;patch keyboard
  245.         tst.l    (a7)
  246.         beq    .endkey
  247.     ;copy map
  248.         move.l    (_keytrans),a0
  249.         add.w    #128+16,a0
  250.         move.l    (a7)+,a1
  251.         add.l    a5,a1
  252.         moveq    #3*16,d0
  253. .key2        move.b    (a0)+,d1
  254.         cmp.b    #'A',d1
  255.         blo    .key3
  256.         cmp.b    #'Z',d1
  257.         bls    .key4
  258. .key3        moveq    #-1,d1
  259. .key4        move.b    d1,(a1)+
  260.         dbf    d0,.key2
  261.     ;find 'Y' key
  262.         moveq    #127,d0
  263.         move.l    (_keytrans),a0
  264.         add.w    #128,a0
  265. .key1        cmp.b    #'y',-(a0)
  266.         dbeq    d0,.key1
  267.     ;set 'Y' key
  268.         move.l    (a7)+,a0
  269.         add.l    a5,a0
  270.         move.b    d0,(a0)
  271. .endkey
  272.  
  273.     ;disable cache
  274.         move.l    #WCPUF_Exp_NCS,d0
  275.         move.l    #WCPUF_Exp,d1
  276.         jsr    (resload_SetCPU,a2)
  277.  
  278.     ;start
  279.         jsr    (a5)
  280.  
  281.     ;quit
  282. .quit        pea    TDREASON_OK
  283.         move.l    (_resload,pc),a2
  284.         jmp    (resload_Abort,a2)
  285.  
  286. ;---------------
  287.  
  288. _plie        PL_START
  289.         PL_P    $5738,_load0
  290.     ;    PL_S    $5fa0,6                ;blithog
  291.         PL_PS    $6d60,_bplcon0
  292.     ;    PL_S    $7786,6                ;blithog
  293.         PL_END
  294.  
  295. _plid        PL_START
  296.         PL_P    $5810,_load0
  297.     ;    PL_S    $6078,6                ;blithog
  298.         PL_PS    $6e38,_bplcon0
  299.     ;    PL_S    $785e,6                ;blithog
  300.         PL_END
  301.  
  302. _pl        PL_START
  303.         PL_PS    $748,_cacheon1
  304.         PL_P    $1ee64,_load0
  305.         PL_P    $1f28e,_save0
  306.         PL_PS    $852,_allocbug
  307.     ;    PL_S    $1f6c6,6            ;blithog
  308.         PL_PS    $20492,_bplcon0
  309.         PL_PS    $4d4,_key
  310.     ;    PL_B    $10ed2,$66            ;beq -> bne
  311.     ;    PL_PS    $4fa,_keyfix
  312.     ;    PL_I    $10
  313.         PL_END
  314.  
  315. _key        lea    (_ciaa),a1
  316.     ;check if keyboard has caused interrupt
  317.         btst    #CIAICRB_SP,(ciaicr,a1)
  318.         beq    .end
  319.     ;read keycode
  320.         move.b    (ciasdr,a1),d0
  321.     ;set output to low and output mode (handshake)
  322.         clr.b    (ciasdr,a1)
  323.         or.b    #CIACRAF_SPMODE,(ciacra,a1)
  324.     ;calculate rawkeycode
  325.         not.b    d0
  326.         ror.b    #1,d0
  327.     ;set raw
  328.         move.b    (a3),(1,a3)            ;save last raw
  329.         move.b    (2,a3),(3,a3)            ;save last ascii
  330.         move.b    d0,(a3)                ;new raw
  331.         st    (4,a3)
  332.     ;set ascii
  333.         move.l    (a7),a0
  334.         jsr    ($576-$4d4-6,a0)
  335.  
  336.     ;better would be to use the cia-timer to wait, but we arn't know if
  337.     ;they are otherwise used, so using the rasterbeam
  338.     ;required minimum waiting is 75 µs, one rasterline is 63.5 µs
  339.     ;a loop of 3 results in min=127µs max=190.5µs
  340.         moveq    #3-1,d1
  341. .wait1        move.b    (_custom+vhposr),d0
  342. .wait2        cmp.b    (_custom+vhposr),d0
  343.     ;move.w    $dff006,$dff180
  344.         beq    .wait2
  345.         dbf    d1,.wait1
  346.  
  347.     ;set input mode
  348.         and.b    #~(CIACRAF_SPMODE),(ciacra,a1)
  349. .end        move.w    #INTF_PORTS,(intreq+_custom)
  350.         addq.l    #4,a7
  351.         movem.l    (a7)+,d0-a6
  352.         rte
  353.  
  354.     IFEQ 1
  355. _keyfix
  356.         move.b    $bfec01,d0
  357.         beq    .1
  358.         btst    #0,d0            ;up/down
  359.     ;    eor    #4,ccr
  360. .1        rts
  361.  
  362.     ENDC
  363.  
  364. _pld        PL_START
  365.         PL_PS    $748,_cacheon1
  366.         PL_P    $1ee74,_load1
  367.         PL_P    $1f29e,_save1
  368.         PL_PS    $852,_allocbug
  369.     ;    PL_S    $1f6d6,6            ;blithog
  370.         PL_PS    $204a2,_bplcon0
  371.         PL_PS    $4d4,_key
  372.         PL_END
  373.  
  374. _plm        PL_START
  375.         PL_PS    $746,_cacheon2
  376.         PL_P    $1ff1c,_load2
  377.         PL_P    $20346,_save2
  378.         PL_PS    $850,_allocbug
  379.     ;    PL_S    $2077e,6            ;blithog
  380.         PL_PS    $2154a,_bplcon0
  381.         PL_PS    $4d4,_key
  382.         PL_END
  383.  
  384. ;---------------
  385.  
  386. _cacheon1    move.l    #$25a8,d0            ;original
  387.  
  388. _cacheon    movem.l    d0-d1/a0-a1,-(a7)
  389.         move.l    #WCPUF_Exp_CB,d0
  390.         move.l    #WCPUF_Exp,d1
  391.         move.l    _resload,a0
  392.         jsr    (resload_SetCPU,a0)
  393.         movem.l    (a7)+,_MOVEMREGS
  394.         rts
  395.  
  396. _cacheon2    move.l    #$1df0,d0            ;original
  397.         bra    _cacheon
  398.  
  399. _bplcon0    move.w    (12,a6),d0            ;original
  400.         ror.w    #4,d0                ;original
  401.         or.w    #$200,d0            ;enable color output
  402.         rts
  403.  
  404. ;---------------
  405.  
  406. _load2        move.l    (8,a7),a0
  407.         addq.l    #4,a0
  408.         movem.l    a2,-(a7)
  409.         cmp.l    #"MAP/",(a0)
  410.         beq    .sub
  411.         cmp.l    #".DAT",(2,a0)            ;savegames
  412.         beq    .sub
  413.         moveq    #34-1,d0
  414.         lea    (_extram),a1
  415. .chk        move.l    a0,a2
  416. .cmp        move.b    (a2)+,d1
  417.         UPPER    d1
  418.         cmp.b    (a1)+,d1
  419.         bne    .fail
  420.         tst.b    d1
  421.         beq    .sub
  422.         bra    .cmp
  423. .fail        subq.l    #1,a1
  424. .s        tst.b    (a1)+
  425.         bne    .s
  426.         dbf    d0,.chk
  427.         movem.l    (a7)+,_MOVEMREGS
  428.         move.l    a0,(8,a7)
  429.         bra    _loadfile
  430.  
  431. .sub        movem.l    (a7)+,_MOVEMREGS
  432.         move.l    #"D02/",-(a0)
  433.         bra    _loadfile
  434.  
  435. _load1        move.l    (8,a7),a0
  436.         addq.l    #4,a0
  437.         movem.l    a2,-(a7)
  438.         cmp.l    #"MAP/",(a0)
  439.         beq    .sub
  440.         cmp.l    #".DAT",(2,a0)            ;savegames
  441.         beq    .sub
  442.         moveq    #13-1,d0
  443.         lea    (_extrad),a1
  444. .chk        move.l    a0,a2
  445. .cmp        move.b    (a2)+,d1
  446.         UPPER    d1
  447.         cmp.b    (a1)+,d1
  448.         bne    .fail
  449.         tst.b    d1
  450.         beq    .sub
  451.         bra    .cmp
  452. .fail        subq.l    #1,a1
  453. .s        tst.b    (a1)+
  454.         bne    .s
  455.         dbf    d0,.chk
  456.         movem.l    (a7)+,_MOVEMREGS
  457.         move.l    a0,(8,a7)
  458.         bra    _loadfile
  459.  
  460. .sub        movem.l    (a7)+,_MOVEMREGS
  461.         move.l    #"D01/",-(a0)
  462.         bra    _loadfile
  463.  
  464.  
  465. _load0        addq.l    #4,(8,a7)            ;skip "BI?:"
  466.  
  467.     ;in:
  468.     ;(4,a7)  memflag (-1=any 0=chip *=memptr)
  469.     ;(8,a7)  name
  470.     ;(12,a7) buffer $2028
  471.     ;out
  472.     ;d0 = mem
  473.     ;d1 = length
  474. _loadfile    movem.l    d2-d3/a2/a6,-(a7)
  475.         move.l    (_resload),a2
  476.         tst.l    (_MOVEMBYTES+4,a7)
  477.         beq    .calc
  478.         bpl    .load
  479.  
  480. .calc
  481.     illegal
  482.     ifeq 1
  483.         moveq    #8,d0                ;length
  484.         moveq    #0,d1                ;offset
  485.         move.l    (_MOVEMBYTES+8,a7),a0        ;name
  486.         move.l    a7,a1                ;dest
  487.         jsr    (resload_LoadFileOffset,a2)
  488.         cmp.l    #"TPWM",(a7)
  489.         beq    .packed
  490.         cmp.l    #"RNC"<<8+1,(a7)
  491.         beq    .packed
  492.         cmp.l    #"RNC"<<8+2,(a7)
  493.         beq    .packed
  494.         cmp.l    #"IMP!",(a7)
  495.         beq    .packed
  496.  
  497.         move.l    (_MOVEMBYTES+8,a7),a0        ;name
  498.         jsr    (resload_GetFileSize,a2)
  499.         bra    .getmem
  500.  
  501. .packed        move.l    (4,a7),d0            ;unpacked length
  502.  
  503. .getmem        moveq    #MEMF_CHIP,d1
  504.         tst.l    (_MOVEMBYTES+4,a7)
  505.         beq    .alloc
  506.         moveq    #MEMF_ANY,d1
  507. .alloc        move.l    (4),a6
  508.         jsr    (_LVOAllocMem,a6)
  509.         move.l    d0,(_MOVEMBYTES+4,a7)
  510.     endc
  511.  
  512. .load        move.l    (_MOVEMBYTES+8,a7),a0        ;name
  513.         move.l    (_MOVEMBYTES+4,a7),a1        ;dest
  514.         jsr    (resload_LoadFileDecrunch,a2)
  515.         move.l    d0,d1                ;length
  516.         move.l    (_MOVEMBYTES+4,a7),d0        ;address
  517.         movem.l    (a7)+,_MOVEMREGS
  518.         
  519. .end        rts
  520.  
  521. _save2        move.l    (4,a7),a0
  522.         move.l    #"D02/",(a0)
  523.         bra    _savefile
  524.  
  525. _save1        move.l    (4,a7),a0
  526.         move.l    #"D01/",(a0)
  527.         bra    _savefile
  528.  
  529. _save0        addq.l    #4,(4,a7)            ;skip "BI?:"
  530.  
  531.     ;in:
  532.     ;(4,a7)  name
  533.     ;(8,a7)  buffer
  534.     ;(12,a7) length
  535.     ;out
  536.     ;d0 = rc (0=success)
  537. _savefile    movem.l    a2,-(a7)
  538.         move.l    (_resload),a2
  539.         move.l    (_MOVEMBYTES+12,a7),d0
  540.         move.l    (_MOVEMBYTES+4,a7),a0
  541.         move.l    (_MOVEMBYTES+8,a7),a1
  542.         jsr    (resload_SaveFile,a2)
  543.         moveq    #0,d0
  544.         movem.l    (a7)+,_MOVEMREGS
  545.         rts
  546.  
  547. _openlib    cmp.l    #"dos.",(a1)
  548.         bne    .org
  549.         move.l    #-$10000,d0
  550.         rts
  551. .org        move.l    _openlib_save,-(a7)
  552.         rts
  553.  
  554.     ;game allocates same memory again and again
  555. _allocbug    move.l    (_bugmem),d0
  556.         bne    .already
  557.  
  558.         move.l    (4,a7),d0
  559.         move.l    #MEMF_CLEAR,d1
  560.         move.l    a6,-(a7)
  561.         move.l    4,a6
  562.         jsr    (_LVOAllocMem,a6)
  563.         move.l    (a7)+,a6
  564.         lea    (_bugmem),a0
  565.         move.l    d0,(a0)
  566.         rts
  567.  
  568. .already    move.l    d0,a0
  569.         move.l    (4,a7),d1
  570. .clr        clr.l    (a0)+
  571.         clr.l    (a0)+
  572.         subq.l    #8,d1
  573.         bhi    .clr
  574.         rts
  575.  
  576. ;---------------
  577.  
  578. _tag        dc.l    WHDLTAG_CUSTOM1_GET
  579. _custom1    dc.l    0
  580.         dc.l    WHDLTAG_KEYTRANS_GET
  581. _keytrans    dc.l    0
  582.         dc.l    0
  583.         dc.l    0
  584. _openlib_save    dc.l    0
  585. _bugmem        dc.l    0
  586.  
  587. ;============================================================================
  588.  
  589.     INCLUDE    Sources:whdload/kick13.s
  590.  
  591. ;============================================================================
  592.  
  593.     END
  594.